#ifndef SERVIDOR_H_
#define SERVIDOR_H_

#include "../../Modelo/ClaseModelo/Modelo.h"
#include "../../Utils/Timer.h"
#include "../../Utils/YamlParser.h"
#include "../../Utils/Logger.h"
#include <getopt.h>
#include <pthread.h>
#include <algorithm>
#include "../Sincronizador.h"

#include "BuscadorCliente.h"
#include "ControladorConexiones.h"

#include <vector>
#include <string>

#include <unistd.h>

#define LOG_SERVIDOR "servidor.log"

#if INSTALANDO
#define PATH_SINCRONIZACION_SERVIDOR PATH_RESOURCES
#else
#define PATH_SINCRONIZACION_SERVIDOR "../Resources/"
#endif

using namespace std;

class Servidor {
	
	Modelo* modelo;
	Timer timer;
		
	BuscadorCliente* buscador;
	ControladorConexiones* controlador;
	
	public:
	
		std::ofstream log_servidor;
	
		Servidor(int puerto, Juego juego, string nivel, int cantidadJugadores);
		~Servidor();
		
		void Sincronizar(int cliente);
		void Correr(unsigned int modo = 1);
		void TerminarJuego();
		
		BuscadorCliente* getBuscador();
		Modelo* getModelo();
		Timer getTimer();		
		ControladorConexiones* getControladorConexiones();

};

typedef struct ClientePotencial__ {
	int socket;
	Servidor* servidor;
} ClientePotencial_t;

void* BuscarClientes(void* data);
void* IngresoCliente(void* data);
void* ManejoConexiones(void* data);

#endif /* SERVIDOR_H_ */
